(defn
  ^String  ; Return type; can also do ^{:tag String} along w/ other metadata like :doc and :test.
  greeting
  "Return who is to be greated."
  ([] "World")  ; can specify a condition-map containing :pre and :post between params and exprs.
  ([x] x)
  ([x y] (str x ", and " y))
  ([x y & more] (str x ", " (apply greeting y more))) ; NOT a tail call
)

(println "Hello," (str (apply greeting *command-line-args*) "!"))
